﻿// Inner Fire 游戏引擎库
// 渲染项目类-Text渲染项目
//
// Copyright (c) 2024 by 尔西大帝. All rights reserved.
//
// 用于UI中的Text渲染项目
// 目前我暂时没有想到到底是Text和UI分离，还是和UI合并在一起比较好。
// 因为讲道理Text也属于UI，机制也差不多。但目前还是分离，进行一个继承机制比较好。
// 在以后的开发过程看情况是否合并。
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2024-12-21

#pragma once

#include <dx/core/upload_buffer.h>
#include <dx/ui/ui_render_item.h>
#include <dx/ui/ui_instanced_data.h>
#include <ui/text/bmfont.h>

namespace ifire::dx {

struct DxTextDesc {
  UIWidget Widget;
  size_t Capacity;
  const char* pText;
  size_t Length;
  ui::BMFont* Font;
  float FontSize;
  float TextPadding;
  UIAlign TextAlign;
  XMFLOAT2 ClientSize;
};

class DxText : public UIRenderItem {
public:
  DxText(const DxTextDesc& desc);
  DxText(const DxText& lhs) = delete;
  DxText& operator=(const DxText& lhs) = delete;
  ~DxText();

  // 设置位置
  void SetPosition(DirectX::XMFLOAT2 position);
  // 格式化设置文字
  size_t Print(const char* format, ...);
  // 格式化设置文字
  size_t VPrint(const char* format, va_list args);
  // 设置文字
  void SetText(const char* text, size_t len = 0);
  // 更新此文字在缓冲区的项目
  void Update(XMFLOAT2 client_size, UploadBuffer<UIInstancedData>* uploader);

  // 此文字的全局ID（在每次运行中，每个项目都是唯一的，由DxUtil配发）
  int instanced_id;
  // 此文字的字号大小，以高度为标准，比如32指文字的高为32。以像素为单位
  float font_size;
  // 此文字的padding
  float text_padding;
  // 文字的Align
  UIAlign text_align;
  // 此文字的字体
  ui::BMFont* font;
  // 用于存储文字的BUFFER
  char* buffer;
  // 当前文字的长度
  size_t length;

private:
  // 计算这个项目的大小，以屏幕分辨率为单位
  XMFLOAT2 CalculatePixelSize(
      XMFLOAT2 client_size, XMFLOAT2 scale, ui::BMFont* font) const;
  // 设置一个文字到缓冲区，返回值为CurrentPosition步进的值
  XMFLOAT2 SetChar(char c, XMFLOAT2 current_position, XMFLOAT2 client_size,
      XMFLOAT2 scale, UIInstancedData& data) const;
};

using DxTextPtr = std::unique_ptr<DxText>;
} // namespace ifire::dx